"""
测试在soap:Body中添加xmlns:test命名空间声明的功能
"""

from com.tools.Xml_Utils.xml_utils import XmlUtils


def test_add_namespace_to_body():
    """
    测试在soap:Body中添加xmlns:test命名空间声明
    使用项目规范：通过添加并删除临时元素的方式注册命名空间
    """
    print("测试在soap:Body中添加xmlns:test命名空间声明:")
    
    # 原始SOAP XML报文
    soap_xml = '''<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
               xmlns:web="http://www.webserviceX.NET">
    <soap:Header/>
    <soap:Body>
        <web:GetWeather>
            <web:CityName>Beijing</web:CityName>
            <web:CountryName>China</web:CountryName>
        </web:GetWeather>
    </soap:Body>
</soap:Envelope>'''
    
    print("原始SOAP XML:")
    print(soap_xml)
    
    # 加载XML
    xml_obj = XmlUtils(xml_string=soap_xml)
    
    # 验证初始状态
    print("\n验证初始命名空间:")
    namespaces = xml_obj.get_namespaces()
    print(f"初始命名空间: {namespaces}")
    
    # 检查Body元素是否存在
    body_elements = xml_obj.find_elements("//soap:Body")
    print(f"找到Body元素数量: {len(body_elements)}")
    assert len(body_elements) == 1
    
    body_element = body_elements[0]
    
    # 使用项目规范中提到的方法添加命名空间声明
    print("\n使用规范方法在Body中添加xmlns:test='https://test.com'命名空间声明:")
    
    # 创建一个带test命名空间的临时元素，然后立即删除它
    # 这种操作会在父元素上保留命名空间声明但不留下实际内容
    temp_element = xml_obj.add_element_with_namespace(
        "//soap:Body",
        "TempElement",
        "test",
        "https://test.com"
    )
    
    if temp_element is not None:
        print("成功添加带test命名空间的临时元素")
        # 立即删除临时元素，但保留命名空间声明
        parent = temp_element.getparent()
        if parent is not None:
            parent.remove(temp_element)
            print("已删除临时元素，但保留了命名空间声明")
    
    # 验证命名空间是否已添加
    updated_namespaces = xml_obj.get_namespaces()
    print(f"更新后的命名空间: {updated_namespaces}")
    
    # 检查test命名空间是否已添加
    has_test_namespace = "test" in updated_namespaces and updated_namespaces["test"] == "https://test.com"
    print(f"test命名空间已添加: {has_test_namespace}")
    assert has_test_namespace == True
    
    # 现在添加一个真正的test命名空间元素来验证
    print("\n添加一个真正的test命名空间元素来验证:")
    test_element = xml_obj.add_element_with_namespace(
        "//soap:Body",
        "TestElement",
        "test",
        "https://test.com",
        "测试内容",
        {"id": "test123"}
    )
    
    if test_element is not None:
        print("成功添加test命名空间元素")
    else:
        print("添加test命名空间元素失败")
    
    # 验证添加的元素
    test_element_text = xml_obj.get_element_text(".//test:TestElement")
    test_element_attr = xml_obj.get_element_attribute(".//test:TestElement", "id")
    
    print(f"TestElement文本: {test_element_text}")
    print(f"TestElement属性: {test_element_attr}")
    
    assert test_element_text == "测试内容"
    assert test_element_attr == "test123"
    
    # 转换为字符串并验证
    print("\n转换为字符串并验证:")
    xml_string = xml_obj.to_string(pretty_print=True)
    print("最终XML字符串:")
    print(xml_string)
    
    # 验证关键内容
    assert "测试内容" in xml_string
    assert "id=\"test123\"" in xml_string
    
    print("\n命名空间声明测试完成!")


def test_original_soap_with_body_namespace():
    """
    测试处理原始SOAP XML并在Body中添加命名空间声明
    """
    print("\n\n测试处理原始SOAP XML并在Body中添加命名空间声明:")
    
    # 原始SOAP XML报文
    soap_xml = '''<?xml version="1.0" encoding="UTF-8"?>
        <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
                       xmlns:web="http://www.webserviceX.NET">
            <soap:Header/>
            <soap:Body>
                <web:GetWeather>
                    <web:CityName>Beijing</web:CityName>
                    <web:CountryName>China</web:CountryName>
                </web:GetWeather>
                <web:GetWeatherResponse>
                    <web:GetWeatherResult>
                        <![CDATA[<CurrentWeather><Location>Beijing</Location><Time>2023-01-01 12:00:00</Time><Temperature>10C</Temperature></CurrentWeather>]]>
                    </web:GetWeatherResult>
                </web:GetWeatherResponse>
            </soap:Body>
        </soap:Envelope>'''
    
    print("原始SOAP XML:")
    print(soap_xml)
    
    # 加载XML
    xml_obj = XmlUtils(xml_string=soap_xml)
    
    # 查找Body元素
    body_elements = xml_obj.find_elements("//soap:Body")
    print(f"\n找到Body元素数量: {len(body_elements)}")
    assert len(body_elements) == 1
    
    body_element = body_elements[0]
    
    # 使用规范方法添加命名空间声明
    print("\n使用规范方法在Body中添加xmlns:test='https://test.com'命名空间声明:")
    
    # 创建一个带test命名空间的临时元素，然后立即删除它
    temp_element = xml_obj.add_element_with_namespace(
        "//soap:Body",
        "TempElement",
        "test",
        "https://test.com"
    )
    
    if temp_element is not None:
        print("成功添加带test命名空间的临时元素")
        # 立即删除临时元素，但保留命名空间声明
        parent = temp_element.getparent()
        if parent is not None:
            parent.remove(temp_element)
            print("已删除临时元素，但保留了命名空间声明")
    
    # 验证命名空间是否已添加
    namespaces = xml_obj.get_namespaces()
    print(f"更新后的命名空间: {namespaces}")
    
    # 检查test命名空间是否已添加
    has_test_namespace = "test" in namespaces and namespaces["test"] == "https://test.com"
    print(f"test命名空间已添加: {has_test_namespace}")
    assert has_test_namespace == True
    
    # 添加test命名空间元素
    test_element = xml_obj.add_element_with_namespace(
        "//soap:Body",
        "AdditionalData",
        "test",
        "https://test.com",
        "附加数据",
        {"type": "extra"}
    )
    
    if test_element is not None:
        print("成功添加test命名空间元素")
    else:
        print("添加test命名空间元素失败")
    
    # 转换为字符串并验证
    xml_string = xml_obj.to_string(pretty_print=True)
    print("\n最终XML字符串:")
    print(xml_string)
    
    # 验证关键内容
    assert "附加数据" in xml_string
    assert "type=\"extra\"" in xml_string
    
    print("\n原始SOAP XML添加命名空间声明测试通过!")


def test_namespace_declaration_using_utility_method():
    """
    测试使用XmlUtils工具类的set_element_namespace_declaration方法为soap:Body元素添加xmlns:test属性
    """
    print("\n\n测试使用XmlUtils工具类的set_element_namespace_declaration方法为soap:Body元素添加xmlns:test属性:")
    
    # 原始SOAP XML报文
    soap_xml = '''<?xml version="1.0" encoding="UTF-8"?>
        <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
                       xmlns:web="http://www.webserviceX.NET">
            <soap:Header/>
            <soap:Body>
                <web:GetWeather>
                    <web:CityName>Beijing</web:CityName>
                    <web:CountryName>China</web:CountryName>
                </web:GetWeather>
            </soap:Body>
        </soap:Envelope>'''
    
    print("原始SOAP XML:")
    print(soap_xml)
    
    # 加载XML
    xml_obj = XmlUtils(xml_string=soap_xml)
    
    # 查找Body元素
    body_elements = xml_obj.find_elements("//soap:Body")
    print(f"\n找到Body元素数量: {len(body_elements)}")
    assert len(body_elements) == 1
    
    # 使用XmlUtils工具类的set_element_namespace_declaration方法添加命名空间声明
    print("\n使用XmlUtils工具类的set_element_namespace_declaration方法添加xmlns:test='https://test.com'命名空间声明:")
    result = xml_obj.set_element_namespace_declaration("//soap:Body", "test", "https://test.com")
    print(f"设置命名空间声明结果: {result}")
    
    # 验证命名空间声明是否添加成功
    namespaces = xml_obj.get_namespaces()
    print(f"更新后的命名空间: {namespaces}")
    
    # 检查test命名空间是否已添加
    has_test_namespace = "test" in namespaces and namespaces["test"] == "https://test.com"
    print(f"test命名空间已添加: {has_test_namespace}")
    assert has_test_namespace == True
    
    # 添加test命名空间元素进行验证
    test_element = xml_obj.add_element_with_namespace(
        "//soap:Body",
        "TestData",
        "test",
        "https://test.com",
        "测试数据",
        {"source": "utility"}
    )
    
    if test_element is not None:
        print("成功添加test命名空间元素")
    else:
        print("添加test命名空间元素失败")
    
    # 转换为字符串并验证
    xml_string = xml_obj.to_string(pretty_print=True)
    print("\n最终XML字符串:")
    print(xml_string)
    
    # 验证关键内容
    assert "测试数据" in xml_string
    assert "source=\"utility\"" in xml_string
    
    print("\n使用工具类方法添加命名空间声明测试通过!")


def test_verify_namespace_declaration_in_body():
    """
    验证命名空间声明是否正确添加到Body元素中
    """
    print("\n\n验证命名空间声明是否正确添加到Body元素中:")
    
    # 创建一个简单的XML结构来验证
    xml_obj = XmlUtils.create_empty_xml()
    xml_obj.create_soap_envelope()
    
    print("初始SOAP结构:")
    initial_xml = xml_obj.to_string(pretty_print=True)
    print(initial_xml)
    
    # 使用规范方法添加命名空间声明
    print("\n使用规范方法添加命名空间声明:")
    
    # 创建一个带test命名空间的临时元素，然后立即删除它
    temp_element = xml_obj.add_element_with_namespace(
        "//soap:Body",
        "TempElement",
        "custom",
        "https://custom.namespace.com"
    )
    
    if temp_element is not None:
        print("成功添加带custom命名空间的临时元素")
        # 立即删除临时元素，但保留命名空间声明
        parent = temp_element.getparent()
        if parent is not None:
            parent.remove(temp_element)
            print("已删除临时元素，但保留了命名空间声明")
    
    # 添加一个真正的命名空间元素
    custom_element = xml_obj.add_element_with_namespace(
        "//soap:Body",
        "CustomData",
        "custom",
        "https://custom.namespace.com",
        "自定义数据"
    )
    
    if custom_element is not None:
        print("成功添加custom命名空间元素")
    else:
        print("添加custom命名空间元素失败")
    
    # 转换为字符串
    final_xml = xml_obj.to_string(pretty_print=True)
    print("\n最终XML:")
    print(final_xml)
    
    # 验证命名空间声明和元素都存在
    assert "xmlns:custom=\"https://custom.namespace.com\"" in final_xml
    assert "自定义数据" in final_xml
    
    print("命名空间声明验证测试通过!")


if __name__ == "__main__":
    test_add_namespace_to_body()
    test_original_soap_with_body_namespace()
    test_namespace_declaration_using_utility_method()
    test_verify_namespace_declaration_in_body()
    print("\n\n所有测试案例完成!")